package com.xiaohong.websocket.server;

import com.alibaba.fastjson.JSONObject;
import com.xiaohong.mq.pojo.ReceiveMsg;
import com.xiaohong.mq.pojo.SendMsg;
import org.springframework.stereotype.Component;

import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;


/**
 * 由于是websocket 所以原本是@RestController的http形式
 * 直接替换成@ServerEndpoint即可，作用是一样的 就是指定一个地址
 * 表示定义一个websocket的Server端
 * 这里的服务地址为：ws://localhost:18090/chatRoom/{userId}
 */


/**
 * @author : xiaohong
 * @date : 2021/4/14 8:35
 * 聊天室WebSocket
 */

@ServerEndpoint("/ws/chatRoom")
@Component
public class ChatRoom {

    //将所有客户端对象储存到Map集合中
    private static Map<Long, ChatRoom> clients = new ConcurrentHashMap<Long, ChatRoom>();
    //会话
    private Session session;
    //会话唯一标识，使用openId来确定唯一的
    private Long openId;



    /**
     * 建立连接成功调用
     * @param session
     */
    @OnOpen
    public void onOpen(Session session) {
        System.out.println("连接成功！");
    }

    /**
     * 关闭连接时调用
     * @param session
     */
    @OnClose
    public void onClose(Session session) {
        System.out.println("关闭连接！");
    }

    /**
     * 收到客户端消息后调用的方法
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(Session session, String message) {
        // message是一个json
        // 将message进行反序列化
        SendMsg msg = JSONObject.parseObject(message, SendMsg.class);
        System.out.println(msg);
        // 判断是否是心跳消息
        if (!msg.getHeart()) {
            System.out.println("心跳消息：" + msg.getHeart());
            try {
                //将信息返回到指定用户的页面中
                sendMessageTo(msg.getContent(),Long.parseLong(msg.getReceiver()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }else {
            // 保存当前连接信息
            this.openId = Long.parseLong(msg.getSender());
            this.session = session;
            clients.put(openId,this);
            try {
                //将信息返回到指定用户的页面中
                sendMessageTo("新连接创建成功"+msg.getSender(),Long.parseLong(msg.getSender()));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * @param session
     * @param throwable
     */
    @OnError
    public void onError(Session session, Throwable throwable) {
        System.out.println("连接异常:{}"+throwable);
    }

    /**
     * 向指定的客户端发送数据
     * @param message 推送的信息
     * @param cid 客户id
     */
    public void sendMessageTo(String message, Long cid) throws IOException {
        ChatRoom chatRoom = clients.get(cid);
        chatRoom.session.getAsyncRemote().sendText(message);
    }

    /**
     * 给所有用户进行推送信息
     * @param message 推送的信息
     */
    public void sendMessageAll(String message) throws IOException {
        for (ChatRoom item : clients.values()) {
            item.session.getAsyncRemote().sendText(message);
        }
    }

}
